/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufsc.aps.jogodavida.model;

import br.ufsc.inf.leobr.cliente.Jogada;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Daniel
 */
public class Tabuleiro {

    private Jogador j1;
    private Jogador j2;
    private Baralho baralho = new Baralho();
    private int controleCompraCarta = 0;
    private boolean realizouEnchente = false;
    private static final int LIMITECARTASMAO = 5;
    private static final int LIMITECOMPRACARTA = 2;

    public Jogador getJ1() {
        return j1;
    }

    public void setJ1(Jogador j1) {
        this.j1 = j1;
    }

    public Jogador getJ2() {
        return j2;
    }

    public void setJ2(Jogador j2) {
        this.j2 = j2;
    }

    public Baralho getBaralho() {
        return baralho;
    }

    public void setBaralho(Baralho baralho) {
        this.baralho = baralho;
    }

    public int getControleCompraCarta() {
        return controleCompraCarta;
    }

    public void setControleCompraCarta(int controleCompraCarta) {
        this.controleCompraCarta = controleCompraCarta;
    }

    public boolean isRealizouEnchente() {
        return realizouEnchente;
    }

    public void setRealizouEnchente(boolean realizouEnchente) {
        this.realizouEnchente = realizouEnchente;
    }

    public void criarJogadores(String nome, String nomeOponente) {
        j1 = new Jogador(nome);
        j2 = new Jogador(nomeOponente);
    }

    public TipoLance receberJogada(Jogada jogada) {
        Lance l = (Lance) jogada;
        this.tratarLance(l);
        return l.getTipoLance();
    }

    private void tratarLance(Lance l) {
        setBaralho(l.getBaralho());
        j1.setDaVez(true);
        j2.setDaVez(false);
        if (l.getTipoLance() == TipoLance.JOGADA_INICIO || l.getTipoLance() == TipoLance.FIM_JOGADA_INICIO) {
            j2.setCartasDaMao(l.getCartasMao());
        } else if (l.getTipoLance() == TipoLance.JOGADA_NORMAL) {
            j2.setCartasDaMao(l.getCartasMao());
            j2.setConjuntos(l.getConjuntos());
            this.setControleCompraCarta(0);
        } else if (l.getTipoLance() == TipoLance.ENCHENTE) {
            j1.getCartasDaMao().clear();
            j2.setCartasDaMao(l.getCartasMao());
            j2.setConjuntos(l.getConjuntos());
            this.setControleCompraCarta(0);
            this.setRealizouEnchente(false);
        } else if (l.getTipoLance() == TipoLance.FIM_DE_JOGO) {
            j2.setCartasDaMao(l.getCartasMao());
            j2.setConjuntos(l.getConjuntos());
        }
    }

    public void reset() {
        j1 = null;
        j2 = null;
    }

    public void resetAndOrder(Integer ordem) {
        baralho = new Baralho();
        if (ordem == 1) {
            j1.setDaVez(true);
            j2.setDaVez(false);
        } else {
            j2.setDaVez(true);
            j1.setDaVez(false);
        }
    }

    public void distribuirValoresIniciais() {
        j1.setCartasDaMao(baralho.sortearCartasInicio());
    }

    public String adicionarCarta(Carta carta) {
        if (getJ1().isDaVez()) {
            if (verificarSePodePagarCartaNegativa()) {
                return "Primeiro você deve pagar suas cartas negativas, antes de adicionar suas cartas!";
            } else {
                if (!carta.getDescricao().equals("Enchente!")) {
                    int indexCarta = getJ1().getCartasDaMao().indexOf(carta);
                    int indexConj = getJ1().getConjuntos().indexOf(new Conjunto(carta.getTipoConjunto(), carta.getNaipe()));
                    if(getJ1().getConjuntos().get(indexConj).getCartasDoConjunto().size() == carta.getTipoConjunto().getLimite()) {
                        return "O conjunto "+carta.getTipoConjunto().getNome()+ " com naipe "+carta.getNaipe()+" já está completo!";
                    }
                    else {
                        getJ1().getConjuntos().get(indexConj).adicionarCarta(getJ1().getCartasDaMao().remove(indexCarta));
                    }
                } else {
                    int indexCarta = getJ1().getCartasDaMao().indexOf(carta);
                    getJ1().getCartasDaMao().remove(indexCarta);
                    this.setRealizouEnchente(true);
                }
            }
        } else {
            return "Não é minha vez!";
        }
        return null;
    }

    public String comprarCarta(String bar) {
        if (getJ1().isDaVez()) {
            if (controleCompraCarta < LIMITECOMPRACARTA) {
                if (getJ1().getQuantidadeCartas() < LIMITECARTASMAO) {
                    if (bar.equals("PROFISSAO")) {
                        if (baralho.getCartasProfissao().size() > 0) {
                            getJ1().comprarCarta(baralho.comprarProfissao());
                        } else {
                            return "As cartas de 'Profissão e Carreira' acabaram!";
                        }
                    } else if (bar.equals("COTIDIANO")) {
                        if (baralho.getCartasCotidiano().size() > 0) {
                            getJ1().comprarCarta(baralho.comprarCotidiano());
                        } else {
                            return "As cartas de 'Cotidiano e Família' acabaram!";
                        }
                    } else if (bar.equals("LAZER")) {
                        if (baralho.getCartasAtividades().size() > 0) {
                            getJ1().comprarCarta(baralho.comprarLazer());
                        } else {
                            return "As cartas de 'Atividade e Lazer' acabaram!";
                        }
                    } else {
                        if (baralho.getCartasAcaoSustentavel().size() > 0) {
                            getJ1().comprarCarta(baralho.comprarSustentavel());
                        } else {
                            return "As cartas de 'Ações Sustentáveis' acabaram!";
                        }
                    }
                    controleCompraCarta++;
                } else {
                    return "Você só pode ter 5 cartas positivas na mão!";
                }
            } else {
                return "Você pode comprar só duas cartas por jogada!";
            }
        } else {
            return "Não é minha vez!";
        }
        return null;
    }

    public String pagarCartaNegativa(Carta cartaPositiva, Carta cartaNegativa) {
        if (getJ1().isDaVez()) {
            int indexCartaPositiva = getJ1().getCartasDaMao().indexOf(cartaPositiva);
            getJ1().getCartasDaMao().remove(indexCartaPositiva);
            int indexCartaNegativa = getJ1().getCartasDaMao().indexOf(cartaNegativa);
            getJ1().getCartasDaMao().remove(indexCartaNegativa);
        } else {
            return "Não é minha vez!";
        }
        return null;
    }

    public String passarVez() {
        if (getJ1().isDaVez()) {
            if (controleCompraCarta < 2) {
                if (!verificarSeBaralhoAcabou()) {
                    return "Você deve comprar 2 cartas por jogada!";
                } else {
                    return null;
                }
            } else {
                if (verificarSePodePagarCartaNegativa()) {
                    return "Você possui uma carta negativa, pague com uma positiva!";
                } else {
                    setControleCompraCarta(0);
                    return null;
                }
            }
        } else {
            return "Não é minha vez!";
        }
    }

    public boolean verificarSePodePagarCartaNegativa() {
        for (Carta c : getJ1().getCartasDaMao()) {
            if (c.getPontuacao() < 0) {
                for(Carta aux : getJ1().getCartasDaMao()) {
                    if(aux.getPontuacao() >= (-c.getPontuacao())) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public boolean verificarVencedor() {
        if (verificarSeBaralhoAcabou()) {
            return verificarVencedorPorPontuacao();
        } else {
            return verificarVencedorPorConjuntos();
        }
    }

    public boolean verificarVencedorPorConjuntos() {
        List<String> tipos = new ArrayList<String>();
        for (Conjunto c : getJ1().getConjuntos()) {
            if (c.getCartasDoConjunto().size() == c.getTipo().getLimite()) {
                if(!tipos.get(0).equals(c.getTipo().getNome())) {
                    tipos.add(c.getTipo().getNome());
                }
            }
        }
        if (tipos.size() >= 2) {
            return true;
        }
        return false;
    }

    public boolean verificarVencedorPorPontuacao() {
        int pontosJ1 = getJ1().pontuacaoPorTipoConjunto(TipoConjunto.LAZER) + getJ1().pontuacaoPorTipoConjunto(TipoConjunto.FAMILIA) +
                getJ1().pontuacaoPorTipoConjunto(TipoConjunto.PROFISSAO) + getJ1().pontuacaoPorTipoConjunto(TipoConjunto.SUSTENTAVEL);
        int pontosJ2 = getJ2().pontuacaoPorTipoConjunto(TipoConjunto.LAZER) + getJ2().pontuacaoPorTipoConjunto(TipoConjunto.FAMILIA) +
                getJ2().pontuacaoPorTipoConjunto(TipoConjunto.PROFISSAO) + getJ2().pontuacaoPorTipoConjunto(TipoConjunto.SUSTENTAVEL);
        
        return pontosJ1 > pontosJ2;
    }

    public boolean verificarSeBaralhoAcabou() {
        if (baralho.getCartasAcaoSustentavel().isEmpty() && baralho.getCartasAtividades().isEmpty() && baralho.getCartasCotidiano().isEmpty() && baralho.getCartasProfissao().isEmpty()) {
            return true;
        }
        return false;
    }

}
